package com.event.management.backend.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Set;

/**
 * Redis缓存工具类，用于清除缓存
 */
@Component
@Slf4j
public class CacheUtil {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 清除所有缓存
     */
    public void clearAllCache() {
        try {
            log.info("开始清除所有缓存...");
            Set<String> keys = redisTemplate.keys("*");
            if (keys != null && !keys.isEmpty()) {
                redisTemplate.delete(keys);
                log.info("成功清除{}个缓存", keys.size());
            } else {
                log.info("没有找到需要清除的缓存");
            }
        } catch (Exception e) {
            log.error("清除缓存时发生异常: {}", e.getMessage(), e);
        }
    }

    /**
     * 清除特定前缀的缓存
     * 
     * @param prefix 缓存键前缀
     */
    public void clearCacheByPrefix(String prefix) {
        try {
            log.info("开始清除前缀为 {} 的缓存...", prefix);
            Set<String> keys = redisTemplate.keys(prefix + "*");
            if (keys != null && !keys.isEmpty()) {
                redisTemplate.delete(keys);
                log.info("成功清除{}个缓存", keys.size());
            } else {
                log.info("没有找到前缀为 {} 的缓存", prefix);
            }
        } catch (Exception e) {
            log.error("清除缓存时发生异常: {}", e.getMessage(), e);
        }
    }

    /**
     * 使用Redis的flushDb命令清除当前数据库中的所有缓存
     * 注意：此方法会清除当前Redis数据库中的所有数据，使用需谨慎
     */
    public void flushDb() {
        try {
            log.info("开始执行flushDb清除所有缓存...");
            redisTemplate.execute((RedisConnection connection) -> {
                connection.flushDb();
                return null;
            });
            log.info("成功执行flushDb清除所有缓存");
        } catch (Exception e) {
            log.error("执行flushDb清除缓存时发生异常: {}", e.getMessage(), e);
        }
    }
} 